--- SERVICIOS AVANZADOS DE DISCO --- Un usuario con los servicios b sicos de acceso a ficheros (abrir,cerrar...) puede acceder con facilidad a un fichero una vez que conoce su nombre. Sin embargo gracias a servicios m s avanzados de disco podemos obtener por ejemplo la lista de ficheros de un directorio, etc. Estos servicios son ofrecidos por el sistema operativo (DOS), que devuelve los datos en un buffer denominado DTA ( Area de Transferencia de disco, o para los internacionales, Disk Transfer Area ). Estos datos se encuentran localizados al principio del bloque de memoria reservado para el programa. M s concretamente son los primeros 256 bytes de este bloque los que son utilizados por el DOS para pasar algunos datos a nuestro programa. El DTA se puede localizar a la entrada de nuestro c¢digo ya que en este momento el registro ES apunta a estos datos. Como acceder a ella?, el DTA se encuentra en el desplazamiento 80h por tanto seg£n lo que busquemos as¡ nos tendremos que desplazar dentro del DTA. Imaginemos que buscamos un fichero por ejemplo COM, entonces le diremos al programa que busque el primer fichero que coincida con esta especificaci¢n, si lo encuentra, se pasa una cadena ASCIIZ ( es decir, el nombre del fichero m s un £ltimo byte a 0 ). Entonces el DOS retorna en la DTA los datos del fichero encontrado, si por casualidad quisieramos seguir buscando ficheros, le dir¡amos al programa que buscara el proximo fichero coincidente ( esto se puede hacer mediante la funci¢n 4eh (Buscar la primera entrada) o 4fh (Buscar la pr¢xima entrada), de la int.21h , por si acaso desconoces estas funciones se cargan en AH ). Si por el contrario no encuentra ning£n fichero, retorna un c¢digo de error (activa el flag de acarreo), y m s concretamente 12h en AX, con lo que la busqueda concluye. Todo lo que podemos acceder a trav‚s del DTA queda mostrado en la siguiente tabla: Desplazamiento ( a partir de 80h) Longitud ( en Bytes ) Contenido --------------------------------- --------------------- --------- 0 d o 0h 21 Reservado 21 d o 15h 1 Atributos de fichero 22 d o 16h 2 Hora de creaci¢n 24 d o 18h 2 Fecha de creaci¢n 26 d o 1Ah 4 Tama¤o 30 d o 1Eh 14 Nombre.ext ( en Ascciz ) d -> valor decimal h-> valor hexadecimal Los primeros 21 bytes de la DTA, despu‚s de invocar un servicio para la busqueda del primer fichero coincidente, son rellenados por el DOS con informaci¢n para el uso de llamadas posteriores a la busqueda de otro archivo, por este motivo no se deben modificar. Los siguientes 22 bytes de DTA, contienen los datos del fichero coincidente encontrado, refiri‚ndonos a ellos seg£n la tabla anterior. Por tanto, s¢lo los primeros 43 bytes son utilizados por estas llamadas al MS-DOS. Por otro lado cuando queramos acceder a estos campos de la DTA, tendremos que tener en mente unas cuantas cuestiones: a) La fecha est  compuesta de dos bytes, de este modo la referencia de a¤o,mes,dia en cuanto a los bits que componen los bytes de la fecha ser¡an los siguientes: 15........8.....5........0 Bits A¤o Mes Dia b) La hora est  compuesta por dos bytes, al igual que la fecha, accedemos a sus datos del siguiente modo, teniendo en mente su localizaci¢n: 15........11.......5.......0 Bits Hora Minuto Seg Ejemplos pr cticos del uso del DTA ---------------------------------- Vamos ahora a explicar unas l¡neas de c¢digo del virus tratado que hace referencia al DTA: mov cx, 43d ;Salva DTA original lea di, bp + DTA_orig mov si, 0080h rep movsb Para que hace esto el virus tratado, es sencillo, mediante una instrucci¢n rep movsb copia 43 bytes ( que vienen indicado en CX ) del desplazamiento 80h del segmento ES ( recorda que ES apunta al DTA al inicializar el programa y no tiene mayor problema ), es decir, copia los 43 bytes originales de la DTA, pues en cada llamada para buscar un fichero coincidente ya sea el primero u otro posterior, estos datos son actualizados con datos del fichero encontrado. De este modo el virus se asegura poder retornar el contenido exacto del DTA. mov ax, 03d02h mov dx, 0009eh ;Abre el file encontrado int 021h Con estas instrucciones el virus abre el fichero encontrado, en ax se encuentra la funci¢n oportuna, pero lo que nos interesa, en DX se muestra el desplazamiento para acceder al nombre del fichero a trav‚s de la DTA. El desplazamiento es 09eh, es decir, 80h + 30d ( = 1eh), por tanto os dar‚is cuenta que para acceder a un campo determinado se le suma al desplazamiento que apunta inicialmente al DTA ( 80h) el valor donde se encuentra la zona a consultar, de este modo 80h + 1eh = 09eh (1eh es el desplazamiento que indica el contenido del nombre.ext del fichero, es decir, 30d), de este modo obtenemos el nombre del fichero a trav‚s del DTA. mov cx, 2 ;Calcula el jmp para el virus mov si, 009ah ;(longitud del prog. + 1) lea di, bp + Longitud rep movsb add Longitud + bp,1 Por £ltimo vamos a ver estas l¡neas, aqu¡ se muestra como el virus calcula la longitud para el jump que saltar  al c¢digo del virus, pero bueno esto ahora no nos interesa, veamos su funci¢n con el DTA. En SI se encuentra el valor 09ah, que es igual a 80h + 26d ( = 1ah), 80h + 1ah = 09ah, de este modo accedemos al tama¤o del fichero a trav‚s del DTA. Como se pueden dar cuenta las utilidades del uso del DTA son cuantiosas, desde las mostradas hasta, por ejemplo, imaginen que interceptamos las funciones que tiene uso por ejemplo el comando DIR del DOS ( las funciones 11h y 12h de la int.21h). En este caso supongamos que tenemos un virus residente que cada vez que se llame a esta funciones acceda a trav‚s del DTA al fichero/os solicitados y obtenga su tama¤o, le reste el tama¤o del virus y lo guarde en su mismo lugar. De este modo el usuario mediante el comando DIR u otro comando que utilice estas funciones nunca se dar  cuenta del incremento que tiene su fichero, pues el siempre ver  el mismo. Como este procedimiento, todos los que os imagin‚is.... Bueno con esto hay suficiente, hasta el pr¢ximo n£mero. HANDLER